perm filename FNTFAI.FAI[VIS,HPM]1 blob
sn#268905 filedate 1977-03-10 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE FNTFAI
C00007 ENDMK
C⊗;
TITLE FNTFAI
ENTRY L3X2
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←13
LINTAB←←14
T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ PICPNT←5 ↔ BITPNT←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ NFWD←12 ↔ RASW←13 ↔ YHI←14 ↔ CHAR←15
P←17
;routine to assemble a 3 by 2 compressed character. Must initialize
;XLO, YLO for character position, CHAR to point to first word of
;character definition, PIC to point to first word of picture
RETAD: 0
L3X2: POP P,RETAD ; L3X2(PIC,YLO,XLO,CHAR)
POP P,CHAR
POP P,XLO
POP P,YLO
POP P,PIC
PUSH P,12
MOVE RASW,(CHAR)
LSH RASW,-33 ;fetch raster width from font def
MOVEI XHI,-1(RASW) ;use it with XLO to get XHI
ADD XHI,XLO
HRRZ YHI,1(CHAR) ;get DATA ROW COUNT from def
ADDI YHI,-1(YLO) ;use it with YLO to get YHI
MOVEI BITPNT,1(CHAR) ;construct byte pointer
TLO BITPNT,100 ;for bit array
IDIVI XLO,3 ;get position of starting bit
IDIVI XHI,3 ;and finishing bit
SUB XHI,XLO ;calculate number of pic bytes-1
JUMPLE XHI,GT1 ;and if exactly one byte,
SUB XHR,XLR ;calculate how many bits in it-1
GT1: ASH XLR,1 ;calculate jump offset for main loop
SUBI XHR,2 ;and for trailing last byte
MOVN XHR,XHR
ASH XHR,1
MOVE T,BPTAB(PIC) ;set up skeleton byte pointer
ADD T,XLO ;for X
MOVE PICPNT,(T)
SUB YHI,YLO ;set up loop counter for Y
MOVN YHI,YLO ;contains negative count in left,
HRL YLO,YHI ; <TWICE> line number in right
ASH T,1
ADD YLO,T
YLOOP: MOVEI T,(YLO) ;finish up byte pointer by inserting
ASH T,-1 ;line address for current Y position
ADDI T,LINTAB(PIC)
HRR PICPNT,(T)
LDB TT,PICPNT ;pick up first affected picture byte
JUMPE XHI,ONEWD ;is there only one altogether?
MOVE NFWD,XHI ;if more than one, do first fractional
JRST STL(XLR) ;one
FWL: ILDB TT,PICPNT ;and then do all the others but the last
STL: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAIG TT,BMAX(PIC) ;check for byte overflow
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
SOJG NFWD,FWL
ILDB TT,PICPNT ;the last affected byte
ONEWD: JRST RTL(XHR) ;see how much of it to do
RTL: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAIG TT,BMAX(PIC) ;bounds check
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
MOVE T,BITPNT ;check if time to skip BP
LSH T,-36 ;in font definition
CAIGE T,RASW ;to next line
AND BITPNT,[7777777777]
AOBJN YLO,YLOOP ;check if all lines done
POP P,12
JRST @RETAD
END